package com.cskaoyan.javse.oop2._1extends._9override;

/**
 * 方法覆盖（方法的重写）的语法
 * 首先需要继承，子类才能去覆盖父类中的方法
 * 方法的定义：
 * [访问权限修饰符] 返回值类型 方法名 (形参列表){
 *     // 方法体
 * }
 * 为了检测我们写的方法的重写是否合法，需要使用@Override注解。该注解放在子类重写方法的方法头上，用于检测该方法是否是一个重写自父类的方法（如果不是会编译报错）
 *
 * 语法：
 *      1.访问权限修饰符，要么保持一致，要么更宽松。不能更严格。
 *      2.返回值类型，不是，需要保持兼容。
 *          那么何为兼容？自己测试一下
 *      3.方法名，必须严格保持一致。
 *      4.形参列表，必须相同。
 *      5.方法体。无所谓，改可以，不改也可以。
 *
 * 比较一下方法的重载。
 *
 * 注意事项：
 *      1. @Override注解，在方法的重写中必须给出。一方面用于检测重写是否正确，另一方面也能提升代码可读性。
 *          当然，手写注解还是有点麻烦。建议大家重写方法时，
 *          要么用快捷键alt + insert，要么选择快速生成子类重写方法的方式。
 *          可以直接在子类中，直接写出你想要重写的父类方法的名字，出现提示后回车即可。
 *          总之，不要复制粘贴。
 *     2.方法的重写是有限制的，有些方法重写不了。
 *       a.私有方法没有访问权限,重写不了.
 *       b.static静态成员方法,重写不了.
 *       c.构造方法
 *
 *
 * @since 14:40
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        Phone.test();
        IPhone.test();
    }
}

// 手机类
class Phone {
    int age;
    String name;

    public void call() {
        System.out.println("打电话");
    }

    public static void test(){
        System.out.println("static father");
    }
}

class IPhone extends Phone {
    // Method does not override method from its superclass
    // @Override
    public void playGame() {
        System.out.println("打游戏");
    }

    // @Override
    public static void test(){
        System.out.println("static son");
    }

    @Override
    public void call() {
        System.out.println("嘿Siri");
    }
}

class HuaWeiPhone extends Phone {
    @Override
    public void call() {
        System.out.println("用手打电话");
    }
}

class XiaoMiPhone extends Phone {
    @Override
    public void call() {
        System.out.println("小爱同学");
    }
}